package com.sjc.designpattern.facade;

/**
 * @Classname FacadePatternDemo
 * @Description 外观模式，又叫门面模式: 将多个内部模块调用封装在一个类中
 * @Date 2020/4/25 16:30
 * @Created by SangJiacun
 */
public class FacadePatternDemo {
    //facade模式场景
    //1. 假设我们现在有两个子系统
    //2. 子系统A，有多个内部模块，模块A、模块B和模块C
    //3. 子系统B，现在有一个功能，需要同时依赖3个模块来实现一个功能
    public static void main(String[] args) {
        // 假设是子系统2
        SystemFacade systemFacade = new SystemFacade();
        systemFacade.execute();

        // 好处1：子系统2不需要care太多的模块，只要care一个门面类的接口就可以了
        // 好处2：如果多个地方都要调用这段逻辑，那么如果这个逻辑变了，只需要在门面类一个地方修改就可以了
    }

    /**
     * 子系统1的门面类
     */
    public static class SystemFacade{
        // 子系统1，封装了自己的多个模块，ABC，基于自己多个模块的功能，对外统一暴露出去一个功能

        public void execute(){
            ModuleA moduleA = new ModuleA();
            ModuleB moduleB = new ModuleB();
            ModuleC moduleC = new ModuleC();

            moduleA.execute();
            moduleB.execute();
            moduleC.execute();
            System.out.println("新增的一段逻辑");
        }
    }

    public static class ModuleA {
        public void execute() {
            System.out.println("子系统1的模块A 的功能");
        }
    }

    public static class ModuleB {
        public void execute() {
            System.out.println("子系统1的模块B 的功能");
        }
    }

    public static class ModuleC {
        public void execute() {
            System.out.println("子系统1的模块C 的功能");
        }
    }
}
